// ignore_for_file: use_build_context_synchronously

import 'dart:io';

import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_house_manager/api/house.dart';
import 'package:flutter_house_manager/api/user.dart';
import 'package:flutter_house_manager/controller/build_controller.dart';
import 'package:flutter_house_manager/utils/CameraDialog.dart';
import 'package:get/get.dart' hide FormData, MultipartFile;
import 'package:image_picker/image_picker.dart';

import '../../utils/toast.dart';

class HouseForm extends StatefulWidget {
  const HouseForm({super.key, this.id});
  final String? id;

  @override
  State<HouseForm> createState() => _HouseFormState();
}

class _HouseFormState extends State<HouseForm> {
  BuildController controller = Get.find<BuildController>();
  Map<String, dynamic> _formData = {
    'point': '', // 小区信息
    'building': '', // 小区楼栋信息
    'room': '', // 小区房间信息
    'name': '', // 业主姓名
    'gender': 1, // 业主性别0女1男
    'mobile': '', // 业主电话
    'idcardFrontUrl': '', // 身份证正面
    'idcardBackUrl': '', // 身份证背面
  };
  String _frontName = ""; // 正面照文件名称
  String _backName = ""; // 背面照文件名称
  bool isEdit = false;
  bool isLoading = false;
  bool loading = false;
  Widget _buildAddIdcardPhoto(String tag, String info) {
    return GestureDetector(
      onTap: () {
        showCameraDialog(context, onLibrary: () {
          openLibrary(tag);
        });
      },
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          const Icon(
            Icons.add,
            size: 30,
            color: Color.fromARGB(255, 85, 145, 175),
          ),
          Text(
            info,
            style: const TextStyle(
              color: Color.fromARGB(255, 85, 145, 175),
            ),
          ),
        ],
      ),
    );
  }

  Widget _buildIdcardPhoto(String tag, String photoUrl) {
    return Stack(children: [
      SizedBox(
          width: MediaQuery.of(context).size.width - 20,
          height: 300,
          child: _formData['id'] == null || _formData['id'] == ''
              ? kIsWeb
                  ? Image.network(photoUrl, fit: BoxFit.contain)
                  : Image.file(File(photoUrl), fit: BoxFit.contain)
              : Image.network(photoUrl, fit: BoxFit.contain)),
      Positioned(
        right: 0,
        top: 0,
        child: GestureDetector(
          child: const Icon(Icons.delete, color: Colors.red),
          onTap: () {
            setState(() {
              _formData[tag] = '';
            });
          },
        ),
      )
    ]);
  }

  @override
  void initState() {
    super.initState();
    _formData['point'] = controller.buildInfo['point'];
    _formData['building'] = controller.buildInfo['building'];
    _formData['room'] = controller.buildInfo['room'];
    // 判断是否有id参数 有则证明是编辑房屋信息
    if (widget.id.toString().isNotEmpty) {
      getHouseDetail(widget.id.toString());
      isEdit = true;
    }
  }

  // 定义控制器
  final TextEditingController _nameController = TextEditingController();
  final TextEditingController _mobileController = TextEditingController();
// 上传图片到接口服务器 得到图片的url地址
  uploadImage(String url, String fileName) async {
    FormData data;
    if (kIsWeb) {
      Uint8List list = await XFile(url).readAsBytes(); // 读取二进制
      // 要得到file对象
      MultipartFile file = MultipartFile.fromBytes(list, filename: fileName);
      data = FormData.fromMap({"file": file}); // 得到formData类型要进行上传
    } else {
      data = FormData.fromMap({"file": MultipartFile.fromFileSync(url)});
    }
    final res = await uploadAvatarAPI(data);
    return res["url"]; // 上传成功的地址
  }

  // 提交表单
  _onSubmit() async {
    String name = _nameController.text;
    String mobile = _mobileController.text;
    // 提交数据
    // 检查 小区 楼栋 和房间不能为空
    if ((_formData["point"] as String).isEmpty ||
        (_formData["building"] as String).isEmpty ||
        (_formData["room"] as String).isEmpty) {
      PromptAction.showError("小区楼栋房间信息不能为空");
      return;
    }
    if (name.isEmpty) {
      PromptAction.showError("业主姓名不能为空");
      return;
    }
    if (!RegExp(r'^[\u4e00-\u9fa5]{2,10}').hasMatch(name)) {
      PromptAction.showError("业主姓名为2-10个汉字");
      return;
    }
    if (mobile.isEmpty) {
      PromptAction.showError("业主电话不能为空");
      return;
    }
    if (!RegExp(r'^1[3-9]\d{9}$').hasMatch(mobile)) {
      PromptAction.showError("业主电话格式不正确");
      return;
    }

    // 检查身份证照片是否上传
    if (_formData["idcardFrontUrl"].isEmpty ||
        _formData["idcardBackUrl"].isEmpty) {
      PromptAction.showError("请上传身份证照片");
      return;
    }
    setState(() {
      isLoading = true;
    });
    // 上传图片
    // 判断图片地址中是否以http或者以https开头
    if (!_formData["idcardFrontUrl"].startsWith("http") &&
        !_formData["idcardFrontUrl"].startsWith("https")) {
      try {
        _formData["idcardFrontUrl"] =
            await uploadImage(_formData["idcardFrontUrl"], _frontName);
      } catch (e) {
        PromptAction.showError("上传图片失败");
        isLoading = false;
        return;
      }
    }
    if (!_formData["idcardBackUrl"].startsWith("http") &&
        !_formData["idcardBackUrl"].startsWith("https")) {
      try {
        _formData["idcardBackUrl"] =
            await uploadImage(_formData["idcardBackUrl"], _backName);
      } catch (e) {
        PromptAction.showError("上传图片失败");
        isLoading = false;
        return;
      }
    }
    // 删除_formData中多余的属性
    _formData.removeWhere((key, value) => key == 'status');
    // 提交数据
    try {
      // PromptAction.showSuccess(_formData.toString());
      await addHouseAPI(_formData);
      PromptAction.showSuccess(
          "${widget.id.toString().isEmpty ? '添加' : '修改'}成功");
      BuildController().updateBuildInfo({'point': '', 'build': '', 'room': ''});
      Navigator.popUntil(context, (route) {
        return route.settings.name == '/';
      });
      Navigator.pushNamed(context, '/houselist');
    } catch (e) {
      // PromptAction.showError("${widget.id.toString().isEmpty ? '添加' : '修改'}失败");
      PromptAction.showError(e.toString());
      return;
    } finally {
      setState(() {
        isLoading = false;
      });
    }

    setState(() {
      _formData['name'] = name;
      _formData['mobile'] = mobile;
    });
  }

// 打开相册 获取图片
  openLibrary(String tag) async {
    // 1.创建一个选择图片的实例
    ImagePicker picker = ImagePicker();
    // 2.调用方法打开相册
    XFile? file = await picker.pickImage(source: ImageSource.gallery);
    // 3.判断图片是否获取成功
    if (file != null) {
      // PromptAction.showSuccess(file.path);
      // 4.存储图片地址和名称
      if (tag == "idcardFrontUrl") {
        _frontName = file.name;
      } else {
        _backName = file.name;
      }
      _formData[tag] = file.path;
      // 5.刷新页面
      setState(() {});
      Navigator.of(context).pop();
    }
  }

// 如果有id 说明是编辑房屋信息 没有则说明是获取房屋信息
  getHouseDetail(String id) async {
    setState(() {
      loading = true;
    });
    final res = await getHouseDetailAPI(id);
    setState(() {
      loading = false;
    });
    _nameController.text = res['name'];
    _mobileController.text = res['mobile'];
    setState(() {
      _formData = res;
    });
  }

  // @override
  // void didChangeDependencies() {
  //   super.didChangeDependencies();
  //   // 获取路由传递的参数
  //   final params = ModalRoute.of(context)?.settings.arguments as Map?;
  //   if (params != null && params['id'] != '') {
  //     // 调用接口获取房屋详情
  //     getHouseDetail(params['id']);
  //   }
  // }

  @override
  Widget build(BuildContext context) {
    if (isLoading) {
      return Container(
        width: double.infinity,
        height: double.infinity,
        alignment: Alignment.center,
        decoration: const BoxDecoration(color: Colors.transparent),
        child: const CircularProgressIndicator(),
      );
    }
    return GetBuilder<BuildController>(builder: (controller) {
      return Scaffold(
        appBar: AppBar(
          title: Text('${isEdit ? '编辑' : '添加'}房屋信息'),
          backgroundColor: Colors.transparent,
          centerTitle: true,
        ),
        body: loading
            ? Container(
                width: double.infinity,
                height: double.infinity,
                alignment: Alignment.center,
                decoration: const BoxDecoration(color: Colors.transparent),
                child: const CircularProgressIndicator(),
              )
            : ListView(
                padding: const EdgeInsets.only(top: 10, bottom: 10),
                children: [
                  // 房屋信息
                  Container(
                    padding: const EdgeInsets.all(10),
                    child: const Text(
                      '房屋信息',
                      style: TextStyle(
                          color: Color.fromARGB(255, 97, 94, 94), fontSize: 16),
                    ),
                  ),
                  Container(
                    color: Colors.white,
                    padding: const EdgeInsets.only(
                        left: 10, right: 10, top: 15, bottom: 15),
                    child: Text(
                        '${_formData['point']}${_formData['building']}${_formData['room']}'),
                  ),
                  // 业主信息
                  Container(
                    padding: const EdgeInsets.all(10),
                    child: const Text(
                      '业主信息',
                      style: TextStyle(
                          color: Color.fromARGB(255, 97, 94, 94), fontSize: 16),
                    ),
                  ),
                  // 业主姓名
                  Container(
                    color: Colors.white,
                    padding: const EdgeInsets.only(left: 10, right: 10),
                    child: TextField(
                      onChanged: (value) => {_formData['name'] = value},
                      controller: _nameController,
                      maxLength: 15,
                      decoration: const InputDecoration(
                        labelText: '姓名',
                        hintText: '请输入业主姓名',
                        hintStyle: TextStyle(color: Colors.grey),
                        border: InputBorder.none,
                      ),
                      inputFormatters: [
                        LengthLimitingTextInputFormatter(10),
                      ],
                    ),
                  ),
                  // 性别
                  Container(
                    color: Colors.white,
                    padding: const EdgeInsets.only(left: 10, right: 10),
                    child: Row(
                      children: [
                        const Text(
                          '性别',
                          style: TextStyle(fontSize: 16),
                        ),
                        const SizedBox(width: 20),
                        Radio(
                          value: 1,
                          groupValue: _formData['gender'],
                          onChanged: (value) {
                            setState(() {
                              _formData['gender'] = value ?? '';
                            });
                          },
                        ),
                        const Text('男'),
                        const SizedBox(width: 10),
                        Radio(
                          value: 0,
                          groupValue: _formData['gender'],
                          onChanged: (value) {
                            setState(() {
                              _formData['gender'] = value ?? '';
                            });
                          },
                        ),
                        const Text('女'),
                      ],
                    ),
                  ),
                  // 业主手机号
                  Container(
                    color: Colors.white,
                    padding: const EdgeInsets.only(left: 10, right: 10),
                    child: TextField(
                      controller: _mobileController,
                      keyboardType: TextInputType.phone,
                      maxLength: 11,
                      decoration: const InputDecoration(
                        labelText: '手机号',
                        hintText: '请输入您的手机号',
                        hintStyle: TextStyle(color: Colors.grey),
                        border: InputBorder.none,
                      ),
                      inputFormatters: [
                        LengthLimitingTextInputFormatter(11),
                      ],
                    ),
                  ),
                  // 业主信息
                  Container(
                    padding: const EdgeInsets.all(10),
                    child: const Text(
                      '本人身份证照片',
                      style: TextStyle(
                          color: Color.fromARGB(255, 97, 94, 94), fontSize: 16),
                    ),
                  ),
                  Container(
                    padding:
                        const EdgeInsets.only(left: 10, right: 10, bottom: 10),
                    child: const Text(
                      '请拍摄证件原件，并使照片中证件边缘完整，文字清晰，光线均匀。',
                      style: TextStyle(
                          color: Color.fromARGB(255, 97, 94, 94), fontSize: 12),
                    ),
                  ),
                  // 身份证正面
                  Container(
                    color: Colors.white,
                    height: 320,
                    padding: const EdgeInsets.all(10),
                    child: _formData['idcardFrontUrl'] == ''
                        ? _buildAddIdcardPhoto('idcardFrontUrl', '上传人像面照片')
                        : _buildIdcardPhoto(
                            'idcardFrontUrl',
                            _formData['idcardFrontUrl'],
                          ),
                  ),
                  const SizedBox(height: 20),
                  // 身份证反面
                  Container(
                    color: Colors.white,
                    height: 320,
                    padding: const EdgeInsets.all(10),
                    child: _formData['idcardBackUrl'] == ''
                        ? _buildAddIdcardPhoto('idcardBackUrl', '上传国徽面照片')
                        : _buildIdcardPhoto(
                            'idcardBackUrl',
                            _formData['idcardBackUrl'],
                          ),
                  ),
                  const SizedBox(height: 20),
                  // 提交审核
                  Container(
                    padding: const EdgeInsets.all(10),
                    child: ElevatedButton(
                      onPressed: () {
                        _onSubmit();
                      },
                      child: const Column(
                        children: [
                          SizedBox(height: 8),
                          Icon(Icons.exit_to_app),
                          Text('提交审核'),
                          SizedBox(height: 8)
                        ],
                      ),
                    ),
                  ),
                ],
              ),
      );
    });
  }
}
